//!!!!!! 注: 这里的API, 应该封装到  cpas-ui  DevGrid Range 中.
// 暂时没时间, 先放在这里作为取数逻辑里的通用操作函数
/**
 * 重置滚动条
 */
export function resetScrollView(devTableRef) {
    const scrollView = devTableRef?.current?.instance?.getScrollable();
    if (scrollView) {
        scrollView.scrollTo({ left: 0, top: 0 });
    }
}
/**
 * 表格定位
 */
export async function devCellScrollPositionBySelected(devTableRef, key, dataField, baseReportData, columnWidth, isAutoComputedWidth = false //该参数必须column列中都包含width , 如果找不到会使用columnWidth的值
) {
    const { dataSource, columns } = baseReportData;
    if (devTableRef.current) {
        const devTable = devTableRef.current;
        const instance = devTable.instance;
        if (!instance) {
            return;
        }
        const scrollView = instance.getScrollable();
        // stand 模式获取行
        const rowIndex = dataSource.findIndex((item) => {
            return item["主键"] === key;
        });
        // TODO 当前列宽是按照固定列宽计算的, 应该读取option的column里的width做累加求和
        // stand 获取列
        const columnIndex = columns.findIndex((item) => {
            return item.dataField === dataField;
        });
        const tableWidth = instance.element().clientWidth;
        // 从表格最左侧开始
        let cellLeft = 0;
        let offsetWidth = 0;
        if (isAutoComputedWidth) {
            cellLeft = columns
                .slice(0, columnIndex + 1)
                .reduce((accumulator, currentValue) => {
                return (accumulator +
                    (currentValue.width === undefined
                        ? columnWidth
                        : currentValue.width));
            }, 0);
            offsetWidth =
                (tableWidth - (columns[columnIndex]?.width || columnWidth)) / 2;
        }
        else {
            cellLeft = columnWidth * columnIndex;
            offsetWidth = (tableWidth - columnWidth) / 2;
        }
        // // // 将单元格定位到表格上方,以及表格中间
        const countLeft = cellLeft - offsetWidth;
        if (key) {
            await instance.navigateToRow(key);
            const top = scrollView.scrollTop();
            scrollView.scrollTo({ left: countLeft, top: top });
        }
    }
}
/**
 * 单元格选中
 */
export function devCellSelected(devTableRef, key, dataField, columnWidth) {
    // dev表格定位单元格, 排坑过程
    // 1. DevGrid , 在不指定scrolling模式的情况下, 行是虚拟的 , 列是所有的
    // 2. 当把 scrolling模式 指定为 stand 标准模式的情况下, 会变成分页模式. 需要手动指定paging enable false
    // 3. 目前DevGrid.RangeTap 的实现方式是基于dom的 , 支持列为虚拟模式, 行不支持虚拟模式.
    // 4. 如果行列都开启虚拟模式, 定位滚动的时候会出现白屏的情况
    // 5. 如果值中有 bool类型，会解析成Checkbox ,  checkbox会导致行高产生大小变化, 定位出现问题.
    // 6. 如果不在contentReady进行单元格定位逻辑重载, 会将选中状态冲掉.
    // 7. 如果开启columnAutoWidth动态列宽度, 定位会出现问题, 列宽要固定模式
    // 综上所述：当表格需要单元格回显定位的需求时需要如下配置:
    // scrolling={{
    //   mode: "standard",
    //     rowRenderingMode: "standard",
    //     columnRenderingMode: "virtual",
    // }}
    // // onContentReady={onContentReadyCallBack}  要在 onContentReady下进行回调.
    // paging={{
    //   enabled: false,
    // }}
    // 该单元格滚动定位功能,目前仅支持这种模式
    // const { dataSource, columns } = baseReportData;
    if (devTableRef.current) {
        const devTable = devTableRef.current;
        const instance = devTable.instance;
        // stand 模式获取行
        // const rowIndex = dataSource.findIndex((item) => {
        //   return item["主键"] === key;
        // });
        const visibleRow = instance.getVisibleRows();
        const rowIndex = visibleRow.findIndex((item) => {
            return item["key"] === key;
        });
        // 虚拟模式下获取列
        const visibleColumnIndex = instance.getVisibleColumnIndex(dataField);
        // 定位单元格选中. Range 组件的内部函数
        const selectedRange = [
            {
                startRowIndex: rowIndex,
                endRowIndex: rowIndex,
                startColumnIndex: visibleColumnIndex,
                endColumnIndex: visibleColumnIndex,
            },
        ];
        // range 表格自实现api , 选中单元格
        devTable.showSelection(instance, selectedRange);
    }
}
